package com.ruoyi.binding.service.impl;

import com.ruoyi.binding.domain.MhUserGameDispatchConfig;
import com.ruoyi.binding.mapper.MhUserGameDispatchConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class DispatchTaskService {

    @Autowired
    private Scheduler scheduler;


    @Autowired
    private MhUserGameDispatchConfigServiceImpl mhUserGameDispatchConfigServiceImpl;

    /**
     * 启动指定ID的任务。
     * 
     * 该方法会先检查任务是否已经存在，如果存在则先删除旧任务。
     * 然后创建新的任务详情和触发器，将任务调度配置持久化到数据库。
     * 最后将任务加入调度器，并记录日志。
     * 
     * @param taskId 任务唯一标识
     * @throws SchedulerException 如果调度器操作失败
     * @throws IllegalArgumentException 如果指定的任务不存在
     */
    public void startTask(Long taskId) throws SchedulerException {
        MhUserGameDispatchConfig config = mhUserGameDispatchConfigServiceImpl.selectMhUserGameDispatchConfigByTaskId(taskId);
        if (config == null) {
            throw new IllegalArgumentException("任务不存在 taskId=" + taskId);
        }

        JobKey jobKey = JobKey.jobKey("task-" + taskId);

        // 若任务已存在则先删除
        if (scheduler.checkExists(jobKey)) {
            scheduler.deleteJob(jobKey);
        }

        JobDetail jobDetail = JobBuilder.newJob(com.ruoyi.binding.job.DispatchJob.class)
                .withIdentity(jobKey)
                .usingJobData("taskId", taskId)
                .build();

        log.info("【任务创建】taskId={} 查到的信息{}", taskId, config);

        int intervalInSeconds = config.getDispatchInterval().intValue(); // 强制转换
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger-" + taskId)
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(intervalInSeconds)
                        .repeatForever())
                .build();
        if (config.getAutoDispatch()==1){
//            立即启动
            scheduler.scheduleJob(jobDetail, trigger); // 正常注册并立即执行
            log.info("任务 {} 已启动", taskId);
        }else if (config.getAutoDispatch()==0){
//            暂时不启动
            scheduler.scheduleJob(jobDetail, trigger); // 先调度
            scheduler.pauseJob(jobDetail.getKey());    // 立即暂停
            log.info("任务 {} 已创建并暂停", taskId);
        }

    }

    /**
     * 停止指定ID的任务。
     * 
     * 该方法会检查任务是否存在，如果存在则从调度器中删除该任务。
     * 并根据操作结果记录相应的日志信息。
     * 
     * @param taskId 任务唯一标识
     * @throws SchedulerException 如果调度器操作失败
     */
    public void stopTask(Long taskId) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey("task-" + taskId);
        if (scheduler.checkExists(jobKey)) {
            scheduler.deleteJob(jobKey);
            log.info("【任务停止】taskId={}", taskId);
        } else {
            log.warn("【任务停止】taskId={} 不存在", taskId);
        }
    }
}
